﻿using System;
using Server.Items;
using System.Collections;
using System.Collections.Generic;
using Server.Commands;
using Server.Mobiles;
using Server.Targeting;
using Server.Engines.CastSystem;

namespace Server.ClassSystem
{
    public static class MaestroDArme
    {
        // Stats
        private static int[] m_Forza;
        public static int Str(int Livello) { return 95 + (Livello - 12) * 4 + (Livello - 12) / 2; }
        public static int Dex(int Livello) { return 68 + (Livello - 12) * 3; }
        public static int Int(int Livello) { return 42 + (Livello - 12) * 2; }
        public static int Forza(int Livello) { return m_Forza[Livello - 1]; }
        public static int Difesa(int Livello) { return 0; }
        public static int Schivare(int Livello) { return 0; }

        // Combattive
        public static double ArmiDaTaglio(int Livello) { return 78.0 + (Livello - 12) * 3.0; }
        public static double ArmiContundenti(int Livello) { return 78.0 + (Livello - 12) * 3.0; }
        public static double ArmiDaPunta(int Livello) { return 78.0 + (Livello - 12) * 3.0; }
        public static double ArmiDaTiro(int Livello) { return 0.0; }
        public static double Lottare(int Livello) { return 53.0 + (Livello - 12) * 2.8; }
        public static double Tattica(int Livello) { return 73.0 + (Livello - 12) * 3.0; }
        public static double Parare(int Livello) { return 63.0 + (Livello - 12) * 2.5; }

        // Conoscenze
        public static double Anatomia(int Livello) { return 36.0 + (Livello - 12); }
        public static double ConoscenzeAnimali(int Livello) { return 0.0; }
        public static double ConoscenzeArmi(int Livello) { return 36.0 + (Livello - 12); }
        public static double IdentificareOggetti(int Livello) { return 0.0; }
        public static double LinguaggioDeiMorti(int Livello) { return 0.0; }
        public static double ConoscenzaTerreSelvagge(int Livello) { return 0.0; }
        public static double ConoscenzeArcane(int Livello) { return 0.0; }

        // Sotterfugio
        public static double Cercare(int Livello) { return 0.0; }
        public static double Spiare(int Livello) { return 0.0; }
        public static double Rubare(int Livello) { return 0.0; }
        public static double Nascondersi(int Livello) { return 0.0; }
        public static double MuoversiSilenzioso(int Livello) { return 0.0; }
        public static double RimuovereTrappole(int Livello) { return 0.0; }
        public static double Scassinare(int Livello) { return 0.0; }
        public static double Avvelenare(int Livello) { return 0.0; }

        // Altro
        public static double Elemosinare(int Livello) { return 0.0; }
        public static double Curare(int Livello) { return 15.0; }
        public static double Veterinaria(int Livello) { return 0.0; }
        public static double Meditare(int Livello) { return 0.0; }
        public static double ResistenzaMagia(int Livello) { return 68.0 + (Livello - 12) * 3.0; }
        public static double CercareTracce(int Livello) { return 0.0; }
        public static double Suonare(int Livello) { return 0.0; }
        public static double Orientamento(int Livello) { return 0.0; }

        static Dictionary<int, int> TabellaLivelliMinimi;

        public static void Initialize()
        {
            m_Forza = new int[36] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // liv 1-10
                                   0, 16, 17, 17, 17, 18, 18, 18, 19, 19, // liv 11-20
                                   19, 20, 20, 20, 21, 21, 21, 22, 22, 22, // liv 21-30
                                   23, 23, 23, 24, 24, 25}; // liv 31-36

            TabellaLivelliMinimi = new Dictionary<int, int>();

            TabellaLivelliMinimi.Add(1, 12); // .castmaestro 1 -> livello 12
            TabellaLivelliMinimi.Add(2, 14); // .castmaestro 2 -> livello 14
            TabellaLivelliMinimi.Add(3, 14); // .castmaestro 3 -> livello 14
            TabellaLivelliMinimi.Add(4, 16); // .castmaestro 4 -> livello 16
            TabellaLivelliMinimi.Add(5, 18); // .castmaestro 5 -> livello 18
            TabellaLivelliMinimi.Add(6, 20); // .castmaestro 6 -> livello 20
            TabellaLivelliMinimi.Add(7, 22); // .castmaestro 7 -> livello 22
            TabellaLivelliMinimi.Add(8, 24); // .castmaestro 8 -> livello 24
            TabellaLivelliMinimi.Add(9, 26); // .castmaestro 9 -> livello 26
            TabellaLivelliMinimi.Add(10, 28); // .castmaestro 10 -> livello 28
            TabellaLivelliMinimi.Add(11, 32); // .castmaestro 11 -> livello 32
            TabellaLivelliMinimi.Add(12, 34); // .castmaestro 12 -> livello 34
            TabellaLivelliMinimi.Add(13, 36); // .castmaestro 13 -> livello 36

            CommandSystem.Register("castMaestro", AccessLevel.Player, new CommandEventHandler(MaestroDArme.GestoreComandi));
        }

        public static void GestoreComandi(CommandEventArgs e)
        {
            // Check classe
            PlayerMobile player = (PlayerMobile)e.Mobile;

            if (player.Classe != NomeClasse.MaestroDArme && player.AccessLevel < AccessLevel.GameMaster)
                return;

            if (e.Length == 1)
            {
                int comando = e.GetInt32(0);
                // Parsing fallito, comando malformato.
                if (comando == 0)
                    return;

                int livelloMinimo;

                // Valore non valido, non compare nella tabella dei livelli minimi.
                if (!TabellaLivelliMinimi.TryGetValue(comando, out livelloMinimo))
                    return;

                // Il PG e' di livello troppo basso.
                if (livelloMinimo > player.Livello)
                    return;

                switch (comando)
                {
                    case 1:
                        CastSystem.LanciaCast(new Disarmare(player));
                        break;
                    case 2:
                        CastSystem.LanciaCast(new StileNormale(player));
                        break;
                    case 3:
                        CastSystem.LanciaCast(new StileDifensivo(player));
                        break;
                    case 4:
                        CastSystem.LanciaCast(new Intimidire(player));
                        break;
                    case 5:
                        CastSystem.LanciaCast(new StileAggressivo(player));
                        break;
                    case 6:
                        CastSystem.LanciaCast(new Maestria(player));
                        break;
                    case 7:
                        CastSystem.LanciaCast(new StileIrruento(player));
                        break;
                    case 8:
                        CastSystem.LanciaCast(new GranMaestria(player));
                        break;
                    case 9:
                        CastSystem.LanciaCast(new StileAccurato(player));
                        break;
                    case 10:
                        CastSystem.LanciaCast(new ColpoDiScudo(player));
                        break;
                    case 11:
                        CastSystem.LanciaCast(new ParataAdImpatto(player));
                        break;
                    case 12:
                        CastSystem.LanciaCast(new Leggiadria(player));
                        break;
                    case 13:
                        CastSystem.LanciaCast(new SignoreDellaGuerra(player));
                        break;
                    default:
                        player.SendMessage("DEBUG: Contattare staff errore #1102");
                        break;
                }
            }
        }
    }
}